#!/usr/bin/env python
# coding=UTF-8

import pysvn


###############################################################################


class SvnController( object ):


    def __init__( self ):
        self.client = pysvn.Client()
        self.client.exception_style = 1
        self.client.commit_info_style = 1
        self.client.callback_get_login = self.callbackGetLogin
        self.client.callback_cancel = self.callbackCancel
        self.client.callback_notify = self.callbackNotify
        self.client.set_default_username( '' )
        self.client.set_default_password( '' )
        self.loginAttempts = 0
        self.wsRevision = -1


###############################################################################


    def callbackNotify( self, event ):
        if ( event['action'] == pysvn.wc_notify_action.update_completed ):
            self.wcRevision = event['revision'].number


###############################################################################


    def callbackCancel( self ):
        if ( self.loginAttempts > 1 ):
            return True
        else:
            return False


###############################################################################


    def callbackGetLogin( self, realm, username, may_save ):
        self.loginAttempts += 1
        return 1, self.client.get_default_username(), self.client.get_default_password(), False


###############################################################################


    def setUsername( self, username ):
        self.client.set_default_username( username )
        self.loginAttempts = 0


###############################################################################


    def setPassword( self, password ):
        self.client.set_default_password( password )
        self.loginAttempts = 0


###############################################################################


    def checkURL( self, url ):
        try:

            entry = self.client.info2( url,
                                       pysvn.Revision( pysvn.opt_revision_kind.head ),
                                       pysvn.Revision( pysvn.opt_revision_kind.unspecified ),
                                       False )
            self.loginAttempts = 0

        except pysvn.ClientError as e:
            print( e.args[0] )
            return False

        return True


###############################################################################


    def checkWorkingCopy( self, path ):
        try:

            entry = self.client.info2( path )

        except pysvn.ClientError as e:
            print( e.args[0] )
            return False

        return True


###############################################################################


    def getHeadRevision( self, url ):
        try:
            entry = self.client.info2( url,
                                       pysvn.Revision( pysvn.opt_revision_kind.head ),
                                       pysvn.Revision( pysvn.opt_revision_kind.unspecified ),
                                       False )
            self.loginAttempts = 0

        except pysvn.ClientError as e:
            print( e.args[0] )
            return -1

        if ( len( entry ) == 0 ):
            return -1

        return entry[0][1].rev.number


###############################################################################


    def checkout( self, url, path ):
        try:

            revision = self.client.checkout( url, path )
            self.loginAttempts = 0

        except pysvn.ClientError as e:
            print( e.args[0] )
            return -1

        return self.wcRevision


###############################################################################


    def update( self, path ):
        try:

            revision = self.client.update( path )
            self.loginAttempts = 0

        except pysvn.ClientError as e:
            print( e.args[0] )
            return -1

        return self.wcRevision


###############################################################################

if __name__ == '__main__':
    print( "This is not an executable script." )

